import { iapws } from 'yklib'
// 压力单位转换常量
const PA_TO_MPA = 1e-6
const MPA_TO_PA = 1e6

// 温度单位转换常量
const K_TO_C = -273.15
const C_TO_K = 273.15

// 焓/熵单位转换常量
const J_TO_KJ = 1e-3
const KJ_TO_J = 1e3

// ---------------------------------- 根据PT计算其他参数 --------------------------------------
/**
 * 已知压力温度求焓值
 * @param p_MPa 压力，单位：MPa
 * @param t_C 温度，单位：摄氏度
 * @return 焓，单位：kJ/kg
 */
export function H_PT(p_MPa: number, t_C: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const t_K = t_C + C_TO_K
  return iapws.H_PT(p_Pa, t_K) * J_TO_KJ
}

/**
 * 已知压力温度求熵
 * @param p_MPa 压力，单位：MPa
 * @param t_C 温度，单位：摄氏度
 * @return 熵，单位：kJ/(kg·K)
 */
export function S_PT(p_MPa: number, t_C: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const t_K = t_C + C_TO_K
  return iapws.S_PT(p_Pa, t_K) * J_TO_KJ
}

/**
 * 计算比容
 * @param p_MPa 压力，单位：MPa
 * @param t_C 温度，单位：摄氏度
 * @return 比容，单位：m³/kg
 */
export function V_PT(p_MPa: number, t_C: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const t_K = t_C + C_TO_K
  return iapws.V_PT(p_Pa, t_K)
}

/**
 * 计算密度
 * @param p_MPa 压力，单位：MPa
 * @param t_C 温度，单位：摄氏度
 * @return 密度，单位：kg/m³
 */
export function rho_PT(p_MPa: number, t_C: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const t_K = t_C + C_TO_K
  return iapws.rho_PT(p_Pa, t_K)
}

/**
 * 已知压力温度求动力粘度系数
 * @param p_MPa 压力，单位：MPa
 * @param t_C 温度，单位：摄氏度
 * @return 动力粘度，单位：Pa·s
 */
export function mu_PT(p_MPa: number, t_C: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const t_K = t_C + C_TO_K
  return iapws.mu_PT(p_Pa, t_K)
}

// ---------------------------------- 根据PH计算其他参数 --------------------------------------
/**
 * 已知压力和焓求温度
 * @param p_MPa 压力，单位：MPa
 * @param h_kJkg 焓，单位：kJ/kg
 * @return 温度，单位：摄氏度
 */
export function T_PH(p_MPa: number, h_kJkg: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const h_Jkg = h_kJkg * KJ_TO_J
  return iapws.T_PH(p_Pa, h_Jkg) + K_TO_C
}

/**
 * 已知压力和焓求熵
 * @param p_MPa 压力，单位：MPa
 * @param h_kJkg 焓，单位：kJ/kg
 * @return 熵，单位：kJ/(kg·K)
 */
export function S_PH(p_MPa: number, h_kJkg: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const h_Jkg = h_kJkg * KJ_TO_J
  return iapws.S_PH(p_Pa, h_Jkg) * J_TO_KJ
}

/**
 * 已知压力和焓求比容
 * @param p_MPa 压力，单位：MPa
 * @param h_kJkg 焓，单位：kJ/kg
 * @return 比容，单位：m³/kg
 */
export function V_PH(p_MPa: number, h_kJkg: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const h_Jkg = h_kJkg * KJ_TO_J
  return iapws.V_PH(p_Pa, h_Jkg)
}

/**
 * 已知压力和焓求密度
 * @param p_MPa 压力，单位：MPa
 * @param h_kJkg 焓，单位：kJ/kg
 * @return 密度，单位：kg/m³
 */
export function rho_PH(p_MPa: number, h_kJkg: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const h_Jkg = h_kJkg * KJ_TO_J
  return iapws.rho_PH(p_Pa, h_Jkg)
}

/**
 * 已知压力和焓求粘度
 * @param p_MPa 压力，单位：MPa
 * @param h_kJkg 焓，单位：kJ/kg
 * @return 动力粘度，单位：Pa·s
 */
export function mu_PH(p_MPa: number, h_kJkg: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const h_Jkg = h_kJkg * KJ_TO_J
  return iapws.mu_PH(p_Pa, h_Jkg)
}

// ---------------------------------- 根据PS计算其他参数 --------------------------------------
/**
 * 已知压力和熵求焓
 * @param p_MPa 压力，单位：MPa
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 焓，单位：kJ/kg
 */
export function H_PS(p_MPa: number, s_kJkgK: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const s_JkgK = s_kJkgK * KJ_TO_J
  console.log('p_Pa', p_Pa)
  console.log('s_JkgK', s_JkgK)
  return iapws.H_PS(p_Pa, s_JkgK) * J_TO_KJ
}

/**
 * 已知压力和熵求温度
 * @param p_MPa 压力，单位：MPa
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 温度，单位：摄氏度
 */
export function T_PS(p_MPa: number, s_kJkgK: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.T_PS(p_Pa, s_JkgK) + K_TO_C
}

/**
 * 已知压力和熵求比容
 * @param p_MPa 压力，单位：MPa
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 比容，单位：m³/kg
 */
export function V_PS(p_MPa: number, s_kJkgK: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.V_PS(p_Pa, s_JkgK)
}

/**
 * 已知压力和熵求密度
 * @param p_MPa 压力，单位：MPa
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 密度，单位：kg/m³
 */
export function rho_PS(p_MPa: number, s_kJkgK: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.rho_PS(p_Pa, s_JkgK)
}

/**
 * 已知压力和熵求粘度
 * @param p_MPa 压力，单位：MPa
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 粘度，单位：Pa·s
 */
export function mu_PS(p_MPa: number, s_kJkgK: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.mu_PS(p_Pa, s_JkgK)
}

// ---------------------------------- 根据HS计算其他参数 --------------------------------------
/**
 * 已知焓和熵求压力
 * @param h_kJkg 焓，单位：kJ/kg
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 压力，单位：MPa
 */
export function P_HS(h_kJkg: number, s_kJkgK: number) {
  const h_Jkg = h_kJkg * KJ_TO_J
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.P_HS(h_Jkg, s_JkgK) * PA_TO_MPA
}

/**
 * 已知焓和熵求温度
 * @param h_kJkg 焓，单位：kJ/kg
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 温度，单位：摄氏度
 */
export function T_HS(h_kJkg: number, s_kJkgK: number) {
  const h_Jkg = h_kJkg * KJ_TO_J
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.T_HS(h_Jkg, s_JkgK) + K_TO_C
}

/**
 * 已知焓和熵求比容
 * @param h_kJkg 焓，单位：kJ/kg
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 比容，单位：m³/kg
 */
export function V_HS(h_kJkg: number, s_kJkgK: number) {
  const h_Jkg = h_kJkg * KJ_TO_J
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.V_HS(h_Jkg, s_JkgK)
}

/**
 * 已知焓和熵求密度
 * @param h_kJkg 焓，单位：kJ/kg
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 密度，单位：kg/m³
 */
export function rho_HS(h_kJkg: number, s_kJkgK: number) {
  const h_Jkg = h_kJkg * KJ_TO_J
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.rho_HS(h_Jkg, s_JkgK)
}

/**
 * 已知焓和熵求粘度
 * @param h_kJkg 焓，单位：kJ/kg
 * @param s_kJkgK 熵，单位：kJ/(kg·K)
 * @return 粘度，单位：Pa·s
 */
export function mu_HS(h_kJkg: number, s_kJkgK: number) {
  const h_Jkg = h_kJkg * KJ_TO_J
  const s_JkgK = s_kJkgK * KJ_TO_J
  return iapws.mu_HS(h_Jkg, s_JkgK)
}

// ---------------------------------- 饱和状态物性计算 --------------------------------------
/**
 * 根据压力求饱和温度
 * @param p_MPa 压力，单位：MPa
 * @return 饱和温度，单位：摄氏度
 */
export function T_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.T_P(p_Pa) + K_TO_C
}

export const TW_P = T_P
export const TV_P = T_P

/**
 * 根据温度求对应饱和压力
 * @param t_C 温度，单位：摄氏度
 * @return 饱和压力，单位：MPa
 */
export function P_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.P_T(t_K) * PA_TO_MPA
}

export const PW_T = P_T
export const PV_T = P_T

/**
 * 计算饱和水的焓值
 * @param p_MPa 压力，单位：MPa
 * @return 饱和水焓，单位：kJ/kg
 */
export function HW_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.HW_P(p_Pa) * J_TO_KJ
}

/**
 * 计算饱和水的熵
 * @param p_MPa 压力，单位：MPa
 * @return 饱和水熵，单位：kJ/(kg·K)
 */
export function SW_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.SW_P(p_Pa) * J_TO_KJ
}

/**
 * 计算饱和水的比容
 * @param p_MPa 压力，单位：MPa
 * @return 饱和水比容，单位：m³/kg
 */
export function VW_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.VW_P(p_Pa)
}

/**
 * 计算饱和水的密度
 * @param p_MPa 压力，单位：MPa
 * @return 饱和水密度，单位：kg/m³
 */
export function rhoW_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.rhoW_P(p_Pa)
}

/**
 * 计算饱和水的粘度
 * @param p_MPa 压力，单位：MPa
 * @return 饱和水粘度，单位：Pa·s
 */
export function muW_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.muW_P(p_Pa)
}

/**
 * 根据温度计算饱和水焓值
 * @param t_C 温度，单位：摄氏度
 * @return 饱和水焓，单位：kJ/kg
 */
export function HW_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.HW_T(t_K) * J_TO_KJ
}

/**
 * 计算饱和水的比容
 * @param t_C 温度，单位：摄氏度
 * @return 饱和水比容，单位：m³/kg
 */
export function VW_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.VW_T(t_K)
}

/**
 * 计算饱和水的熵
 * @param t_C 温度，单位：摄氏度
 * @return 饱和水熵，单位：kJ/(kg·K)
 */
export function SW_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.SW_T(t_K) * J_TO_KJ
}

/**
 * 计算饱和水的密度
 * @param t_C 温度，单位：摄氏度
 * @return 饱和水密度，单位：kg/m³
 */
export function rhoW_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.rhoW_T(t_K)
}

/**
 * 计算饱和水的粘度
 * @param t_C 温度，单位：摄氏度
 * @return 饱和水粘度，单位：Pa·s
 */
export function muW_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.muW_T(t_K)
}

// ---------------------------------- 饱和蒸汽物性计算 --------------------------------------
/**
 * 计算饱和蒸汽的焓值
 * @param p_MPa 压力，单位：MPa
 * @return 饱和蒸汽焓，单位：kJ/kg
 */
export function HV_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.HV_P(p_Pa) * J_TO_KJ
}

/**
 * 计算饱和蒸汽的熵
 * @param p_MPa 压力，单位：MPa
 * @return 饱和蒸汽熵，单位：kJ/(kg·K)
 */
export function SV_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.SV_P(p_Pa) * J_TO_KJ
}

/**
 * 计算饱和蒸汽的比容
 * @param p_MPa 压力，单位：MPa
 * @return 饱和蒸汽比容，单位：m³/kg
 */
export function VV_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.VV_P(p_Pa)
}

/**
 * 计算饱和蒸汽的密度
 * @param p_MPa 压力，单位：MPa
 * @return 饱和蒸汽密度，单位：kg/m³
 */
export function rhoV_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.rhoV_P(p_Pa)
}

/**
 * 计算饱和蒸汽的粘度
 * @param p_MPa 压力，单位：MPa
 * @return 饱和蒸汽粘度，单位：Pa·s
 */
export function muV_P(p_MPa: number) {
  const p_Pa = p_MPa * MPA_TO_PA
  return iapws.muV_P(p_Pa)
}

/**
 * 根据温度计算饱和蒸汽焓值
 * @param t_C 温度，单位：摄氏度
 * @return 饱和蒸汽焓，单位：kJ/kg
 */
export function HV_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.HV_T(t_K) * J_TO_KJ
}

/**
 * 计算饱和蒸汽的熵
 * @param t_C 温度，单位：摄氏度
 * @return 饱和蒸汽熵，单位：kJ/(kg·K)
 */
export function SV_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.SV_T(t_K) * J_TO_KJ
}

/**
 * 计算饱和蒸汽的比容
 * @param t_C 温度，单位：摄氏度
 * @return 饱和蒸汽比容，单位：m³/kg
 */
export function VV_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.VV_T(t_K)
}

/**
 * 计算饱和蒸汽的密度
 * @param t_C 温度，单位：摄氏度
 * @return 饱和蒸汽密度，单位：kg/m³
 */
export function rhoV_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.rhoV_T(t_K)
}

/**
 * 计算饱和蒸汽的粘度
 * @param t_C 温度，单位：摄氏度
 * @return 饱和蒸汽粘度，单位：Pa·s
 */
export function muV_T(t_C: number) {
  const t_K = t_C + C_TO_K
  return iapws.muV_T(t_K)
}

// ---------------------------------- 反向计算函数 --------------------------------------
/**
 * 已知温度和焓求压力
 * @param t_C 温度，单位：摄氏度
 * @param h_kJkg 焓，单位：kJ/kg
 * @return 压力，单位：MPa
 */
export function P_TH(t_C: number, h_kJkg: number) {
  const t_K = t_C + C_TO_K
  const h_Jkg = h_kJkg * KJ_TO_J
  return iapws.P_TH(t_K, h_Jkg) * PA_TO_MPA
}

export default {
  H_PT,
  S_PT,
  V_PT,
  rho_PT,
  mu_PT,
  H_PS,
  T_PS,
  V_PS,
  rho_PS,
  mu_PS,
  T_PH,
  S_PH,
  V_PH,
  rho_PH,
  mu_PH,
  P_HS,
  T_HS,
  V_HS,
  rho_HS,
  mu_HS,

  P_TH,

  P_T,
  PW_T,
  PV_T,
  T_P,
  TW_P,
  TV_P,

  HW_P,
  VW_P,
  rhoW_P,
  muW_P,
  SW_P,

  HW_T,
  VW_T,
  SW_T,
  rhoW_T,
  muW_T,

  HV_P,
  SV_P,
  VV_P,
  rhoV_P,
  muV_P,

  HV_T,
  SV_T,
  VV_T,
  rhoV_T,
  muV_T
}